<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Go 应用代码解析 - 概述</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <header>
        <h1>Go 应用代码逻辑深度解析 (新手友好版)</h1>
        <nav>
            <a href="index.html" class="active">概述</a> |
            <a href="01_setup_dependencies.html">1. 依赖与全局变量</a> |
            <a href="02_opentelemetry_init.html">2. OpenTelemetry 初始化</a> |
            <a href="03_database_redis_init.html">3. 数据库与 Redis 初始化</a> |
            <a href="04_web_server_routing.html">4. Web 服务器与路由</a> |
            <a href="05_request_handlers.html">5. HTTP 请求处理</a> |
            <a href="06_business_logic.html">6. 核心业务逻辑</a> |
            <a href="07_main_startup_shutdown.html">7. 程序启动与关闭</a>
        </nav>
    </header>

    <main>
        <section id="overview">
            <h2>程序是做什么的？</h2>
            <p>想象一下，这个 Go 程序就像一个小型网络服务中心。它的主要工作是：</p>
            <ul>
                <li>提供简单的用户管理功能：可以创建新用户，也可以根据用户 ID 查询用户信息。</li>
                <li>使用 <strong>Gin</strong> 框架来接收和响应来自网络的请求（比如浏览器或 App 发来的请求）。</li>
                <li>使用 <strong>MySQL</strong> 数据库来长期存储用户数据。</li>
                <li>使用 <strong>Redis</strong> 缓存来临时存放经常访问的用户数据，目的是加快查询速度，减轻数据库压力。</li>
                <li>集成了 <strong>OpenTelemetry (OTel)</strong> 这个“侦探工具”，用来追踪一个请求从进入服务到最终返回的完整过程，帮助开发者了解服务性能和排查问题。</li>
            </ul>
            <p>简单来说，这是一个具备基本 CRUD (创建/读取/更新/删除 - 这里主要是创建和读取) 功能、带缓存、并且可以监控自身运行状况的 Web API 服务。</p>
        </section>

        <section id="architecture">
            <h2>程序架构图 (简化版)</h2>
            <p>下面这张图展示了程序的主要组件以及它们是如何交互的。把鼠标悬停在组件上可以看简单说明。</p>
            <div class="diagram-container">
                <object type="image/svg+xml" data="diagrams/architecture.svg" class="diagram">
                    你的浏览器不支持 SVG，无法显示架构图。
                </object>
            </div>
            <p><strong>图解说明：</strong></p>
            <ol>
                <li><strong>客户端 (Client)</strong>: 比如你的浏览器、手机 App 或其他程序，它会向我们的 Go 服务发送 HTTP 请求 (比如 GET 请求查用户，POST 请求创建用户)。</li>
                <li><strong>Gin Web 框架</strong>: 像一个接待员，接收客户端的请求。
                    <ul>
                        <li><strong>OTel Middleware</strong>: 在请求刚进来和快出去时做记录，这是 OTel 追踪的第一步。</li>
                        <li><strong>Router</strong>: 根据请求的地址 (URL) 和方法 (GET/POST) 决定调用哪个处理函数 (Handler)。</li>
                    </ul>
                </li>
                <li><strong>Handler (请求处理器)</strong>: 这是具体的干活的人。比如 `getUserHandler` 负责处理查用户请求，`createUserHandler` 负责处理创建用户请求。它们会：
                    <ul>
                        <li>创建自己的 OTel Span (追踪单元)，记录自己做了什么。</li>
                        <li>调用下面的业务逻辑层 (Service)。</li>
                        <li>将业务逻辑的结果包装成 JSON 格式返回给 Gin，Gin 再返回给客户端。</li>
                    </ul>
                </li>
                <li><strong>Service Layer (业务逻辑层)</strong>: 这是核心大脑，负责具体的业务规则。比如 `findUserByID` (查找用户) 和 `saveUser` (保存用户)。它们会：
                    <ul>
                         <li>创建自己的 OTel Span。</li>
                         <li>对于查找，先问 Redis 缓存有没有数据。</li>
                         <li>如果缓存没有，就去问 MySQL 数据库。</li>
                         <li>对于保存，直接操作 MySQL 数据库，并可能清除 Redis 里的旧数据。</li>
                    </ul>
                </li>
                 <li><strong>Data Sources (数据源)</strong>:
                    <ul>
                        <li><strong>Redis (缓存)</strong>: 速度快，像个临时记事本，存放热点数据。OTel 插件 (`redisotel`) 会自动记录对 Redis 的操作。</li>
                        <li><strong>MySQL (数据库) via GORM</strong>: 像个大档案柜，永久存储数据。GORM 是一个简化数据库操作的工具。OTel 插件 (`otelgorm`) 会自动记录数据库操作。</li>
                    </ul>
                 </li>
                 <li><strong>OpenTelemetry (OTel) Exporter</strong>: 负责收集所有组件产生的追踪信息 (Spans)，并将它们发送到某个地方（在这个例子中，是直接打印到控制台 `stdouttrace`）。</li>
            </ol>
        </section>

        <section id="navigation">
            <h2>下一步</h2>
            <p>对整体架构有了概念后，我们开始深入代码细节。</p>
            <p>➡️ <a href="01_setup_dependencies.html">点击这里，开始了解程序的依赖与全局变量</a></p>
        </section>
    </main>

    <footer>
        <p>Go 应用代码解析</p>
    </footer>
</body>
</html>